package SSO.sso;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cx.entity.user.MemberUserEntity;
import com.cx.utils.CommonUtil;
import com.cx.utils.ConfigUtil;
import com.cx.utils.JsonUtil;
import com.cx.utils.rps.RequestParameters;

/**
 * 
  * @ClassName(类名)      : ssoUtil
  * @Description(描述)    : 单点登录处理
  * @author(作者)         ：曹轩
  * @date (开发日期)      ：2015年10月12日 上午11:49:34
  *
 */
public class SsoUtil {
	private static String cookieName = ConfigUtil.getString("cookieName", null);//cookie名
	private static Map<String, Object> cookieMap = new HashMap<String, Object>();//登录后，保存cookie及用户信息
	private static final String FAIL_Login = "failed";
	/**
	 * 
	 * @Description(功能描述)    :  登录成功进行cookie操作
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月12日 下午2:10:23 
	 * @exception                : 
	 * @param request
	 * @param response  void
	 */
	public static void toLogin(HttpServletRequest request,HttpServletResponse response,MemberUserEntity user) throws Exception{
		String newCookie = createCookieID();
		//cookie的值对应相应的登陆者
		cookieMap.put(newCookie, user);
		addCookie(response, cookieName, newCookie);
	}
	
	/**
	 * 
	 * @Description(功能描述)    :  验证是否已经登录(接收网页拦截后的httpClient请求)
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月12日 下午3:55:05 
	 * @exception                :   void
	 */
	public static String verifyLogin(RequestParameters rps){
		String newcookie = (String)rps.get("newCookie");
		MemberUserEntity user =(MemberUserEntity)cookieMap.get(newcookie);
		if(CommonUtil.isEmpty(user)){
			return FAIL_Login;
		}
		String  jsonString = toJsonString(user);
		return jsonString;
	}
	
	/**
	 * 
	 * @Description(功能描述)    :  验证是否已经登录(请求登录页面的时候进行的判断)
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月15日 上午10:19:48 
	 * @return  String
	 */
	public static Object verfyLogin(HttpServletRequest request){
		Cookie[] cookies = request.getCookies();
		if(!CommonUtil.isEmpty(cookies)){
			for (int i = 0; i < cookies.length; i++) {
				if(cookies[i].getName().equals(cookieName)){
					String value = cookies[i].getValue();
					return cookieMap.get(value);
				}
			}
		}
		return null;
	}
	
	
	
	/**
	 * 
	 * @Description(功能描述)    :  注销登录
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月12日 下午12:03:25 
	 * @exception                :   void
	 */
	public static void signOut(HttpServletRequest request){
		String cookie = request.getParameter("cookieId");
		cookieMap.remove(cookie);
	}
	
	/**
	 * 
	 * @Description(功能描述)    :  生成cookie
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月12日 下午3:05:39 
	 * @exception                : 
	 * @return  String
	 */
	private static String createCookieID(){
		String uuid = UUID.randomUUID().toString();
		return "Cx"+uuid; 
	}
	/**
	 * 
	 * @Description(功能描述)    :  在cookie中添加一个新的登录cookie
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月12日 下午3:18:05 
	 * @exception                :   void
	 */
	private static void addCookie(HttpServletResponse response,String cookieName,String newCookie){
		Cookie cookie = new Cookie(cookieName, newCookie);
		cookie.setMaxAge(10*1000);
		cookie.setPath("/");
		response.addCookie(cookie);
	}
	
	/**
	 * 
	 * @Description(功能描述)    :  对象转换json字符串
	 * @author(作者)             ：  曹轩
	 * @date (开发日期)          :  2015年10月15日 下午1:09:35 
	 * @exception                : 
	 * @param user
	 * @return  String
	 */
	private static String toJsonString(MemberUserEntity user){
		return JsonUtil.objectToJsonString(user); 
	}
}
